// 模型定义
// 引入时间包
import { DateTime } from 'luxon'
// 引入模型以及先相关的方法，JavaScript是按需引入，不是全量引入
import {
  BaseModel,
  BelongsTo,
  belongsTo,
  column,
  HasMany,
  hasMany,
  ManyToMany,
  manyToMany,
} from '@ioc:Adonis/Lucid/Orm'
// 全量引入用户表
import User from './User'
import { slugify } from '@ioc:Adonis/Addons/LucidSlugify'
import Tag from './Tag'
import Profile from './Profile'
import Comment from './Comment'
import Favorite from './Favorite'

/**
 * 申明文章模型
 * 继承自基础模型模板
 */
export default class Article extends BaseModel {
  // 定义列属性，申明主键，定义属性类型为数字
  @column({ isPrimary: true })
  public id: number

  @column()
  public userId: number

  // 定义模型关联关系，文章从属于用户多对一
  @belongsTo(() => User)
  public user: BelongsTo<typeof User>

  // 定义关联关系，多对对关联
  @manyToMany(() => Tag)
  public tags: ManyToMany<typeof Tag>

  // 多对一从属关系 个人资料
  @belongsTo(() => Profile, { localKey: 'userId', foreignKey: 'userId' })
  public profile: BelongsTo<typeof Profile>

  // 一对多关联，评论
  @hasMany(() => Comment)
  public comments: HasMany<typeof Comment>

  // 被喜欢 一对多关联
  @hasMany(() => Favorite)
  public favorites: HasMany<typeof Favorite>

  // 被某人喜欢
  public async favoritedBy(this: Article, profile: Profile): Promise<boolean> {
    return (await this.related('favorites').query().where('profileId', profile.id).first()) !== null
  }

  // 文章内容 类型为字符串
  @column()
  public body: string

  // 文章标题 字符串类型
  @column()
  public title: string

  // 文章描述，摘要
  @column()
  public description: string

  @column()
  @slugify({
    strategy: 'shortId',
    fields: ['title'],
  })
  public slug: string

  // 时间 自动创建
  @column.dateTime({ autoCreate: true })
  public createdAt: DateTime

  // 更新时间，自动创建，自动更新
  @column.dateTime({ autoCreate: true, autoUpdate: true })
  public updatedAt: DateTime
}
